# -*- coding: utf-8 -*-
"""
DTM验证工具 - 配置管理模块
负责管理项目的配置参数和常量定义
"""

import os
from dataclasses import dataclass
from typing import List, Dict, Any


def _setup_matplotlib():
    """设置matplotlib中文支持"""
    try:
        import matplotlib

        matplotlib.rcParams["font.sans-serif"] = ["SimHei"]  # 使用黑体
        matplotlib.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题
    except ImportError:
        pass  # matplotlib不可用时忽略


# 尝试设置matplotlib
_setup_matplotlib()


@dataclass
class FileConfig:
    """单个文件的配置信息"""

    file_path: str
    fixed_height: float

    def __post_init__(self):
        """验证配置参数"""
        if not os.path.exists(self.file_path):
            raise FileNotFoundError(f"文件不存在: {self.file_path}")
        if not isinstance(self.fixed_height, (int, float)):
            raise ValueError("基准高程必须是数字类型")


@dataclass
class ProjectConfig:
    """项目全局配置"""

    # 路径配置
    project_root: str = ""
    input_dir: str = ""
    output_dir: str = ""

    # 文件格式配置
    supported_extensions: List[str] = None

    # 计算配置
    min_vertices_for_triangulation: int = 3
    default_fixed_height: float = 10.0

    # 输出配置
    figure_dpi: int = 300
    figure_size: tuple = (12, 8)

    def __post_init__(self):
        """初始化默认值"""
        if not self.project_root:
            self.project_root = os.path.dirname(os.path.abspath(__file__))

        if not self.input_dir:
            self.input_dir = os.path.join(self.project_root, "input")

        if not self.output_dir:
            self.output_dir = os.path.join(self.project_root, "output")

        if self.supported_extensions is None:
            self.supported_extensions = [".xlsx", ".xls"]

        # 确保输出目录存在
        os.makedirs(self.output_dir, exist_ok=True)


class ConfigManager:
    """配置管理器"""

    def __init__(self):
        self.project_config = ProjectConfig()
        self.file_configs: List[FileConfig] = []

    def add_file_config(self, file_path: str, fixed_height: float) -> None:
        """添加文件配置"""
        try:
            config = FileConfig(file_path, fixed_height)
            self.file_configs.append(config)
        except (FileNotFoundError, ValueError) as e:
            raise ValueError(f"添加文件配置失败: {e}")

    def remove_file_config(self, file_path: str) -> bool:
        """移除指定文件的配置"""
        original_count = len(self.file_configs)
        self.file_configs = [
            config for config in self.file_configs if config.file_path != file_path
        ]
        return len(self.file_configs) < original_count

    def clear_file_configs(self) -> None:
        """清空所有文件配置"""
        self.file_configs.clear()

    def get_valid_file_configs(self) -> List[FileConfig]:
        """获取所有有效的文件配置"""
        valid_configs = []
        for config in self.file_configs:
            if os.path.exists(config.file_path):
                valid_configs.append(config)
        return valid_configs

    def get_project_config(self) -> ProjectConfig:
        """获取项目配置"""
        return self.project_config

    def update_project_config(self, **kwargs) -> None:
        """更新项目配置"""
        for key, value in kwargs.items():
            if hasattr(self.project_config, key):
                setattr(self.project_config, key, value)
            else:
                raise AttributeError(f"ProjectConfig没有属性: {key}")


# 全局常量定义
class Constants:
    """项目常量定义"""

    # 数据验证相关
    EXCEL_COORDINATE_COLUMNS = [1, 2, 3]  # Excel中坐标列的索引 (X, Y, Z)
    MIN_COORDINATE_VALUE = -1e8  # 坐标的最小合理值 (支持大地坐标系统)
    MAX_COORDINATE_VALUE = 1e8  # 坐标的最大合理值 (支持大地坐标系统)

    # 计算精度相关
    VOLUME_PRECISION = 4  # 体积计算保留小数位数
    AREA_PRECISION = 4  # 面积计算保留小数位数
    HEIGHT_PRECISION = 4  # 高程保留小数位数

    # 文件格式相关
    EXCEL_FILE_EXTENSIONS = [".xlsx", ".xls"]
    IMAGE_FILE_EXTENSION = ".png"
    REPORT_FILE_EXTENSION = ".xlsx"

    # 错误消息
    ERROR_MESSAGES = {
        "insufficient_vertices": "至少需要3个顶点进行三角剖分",
        "invalid_coordinate": "发现无效的坐标数据",
        "file_not_found": "文件不存在",
        "invalid_file_format": "不支持的文件格式",
        "empty_data": "文件中没有有效数据",
        "non_numeric_data": "坐标数据必须为数字类型",
    }

    # 界面文本
    UI_TEXTS = {
        "app_title": "DTM 批量验证工具",
        "file_format_warning": """
        ⚠️ 请确认Excel文件格式 ⚠️

        必须满足以下要求：
        1. 不含表头（第一行为数据）
        2. 列顺序严格为：
           • 第1列：点名称
           • 第2列：X坐标
           • 第3列：Y坐标 
           • 第4列：Z坐标

        注意：坐标值必须为数字类型
        """,
        "processing_complete": "处理完成！",
        "status_ready": "准备就绪",
        "status_processing": "处理中...",
        "status_completed": "✓ 完成",
        "status_failed": "✗ 失败",
        "status_error": "✗ 数据错误",
    }


# 创建全局配置管理器实例
config_manager = ConfigManager()
